/**
 * 
 */
package org.yelongframework.model.support.gson;

import java.lang.reflect.Type;
import java.text.ParseException;
import java.util.Date;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.yelongframework.commons.time.DateUtil;
import org.yelongframework.model.property.nulls.ModelNullProperty;

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

/**
 * 模型date类型JSON反序列化解析
 * 
 * @since 1.0.0
 */
public class ModelDateJsonDeserializer implements JsonDeserializer<Date> {

	/** 解析的模式 */
	private final String[] parsePatterns;

	// ==================================================构造器==================================================

	public ModelDateJsonDeserializer() {
		this(DateUtil.YYYY_MM_DD_HH_MM_SS, DateUtil.YYYY_MM_DD_BAR, DateUtil.YYYY_MM_DD_SLASH);
	}

	/**
	 * @param parsePatterns 解析的模式
	 */
	public ModelDateJsonDeserializer(String... parsePatterns) {
		if (ArrayUtils.isEmpty(parsePatterns)) {
			throw new IllegalArgumentException("parsePatterns cannot be null");
		}
		this.parsePatterns = parsePatterns;
	}

	// ==================================================反序列化==================================================

	@Override
	public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
			throws JsonParseException {
		if (null == json || StringUtils.isBlank(json.getAsString())) {
			return ModelNullProperty.DATE_NULL;
		}
		try {
			return DateUtils.parseDate(json.getAsString(), parsePatterns);
		} catch (ParseException e) {
			throw new JsonParseException(e);
		}
	}

	// ==================================================解析的模式==================================================

	/**
	 * @return 解析的模式
	 */
	public String[] getParsePatterns() {
		return parsePatterns;
	}

}
